pm-dispatch: a metadata project's cards, decisions included, live in its own repo; only platform problems are filed on objectstack/objectui - #17315
Conversation
…its own repo; only platform problems are filed on objectstack/objectui Three 多仓协调 rows sent a single-lane repo's decision cards to the objectstack inbox, fixed the maintainer's inbox at objectstack, and made an unreachable target repo a home for the card. The maintainer's ruling (2026-09-10, verbatim in the PR body) says the practice is the other way round: a metadata project's cards — work and decision cards alike — live in that project's own repo, and the only cards it files on the platform are the platform problems it finds. - SKILL.md 单车道仓 row: decision cards enter the repo's own inbox, never objectstack by default. - SKILL.md 收件箱 row: the decision inbox is per repo — platform decisions in objectstack / objectui, each metadata project's in its own repo; 在飞卡 ⛔ 不中途转仓 unchanged. - SKILL.md 目标仓不可达 row: unreachability is a reading gap, not a home — a seat that can reach the target repo files the card there; until then the request rides the seat post or a coordination card. - core-rules digest: the same inbox rule beside 在飞卡 ⛔ 不中途转仓 (the twin slot; the neighbouring digest lines have no byte headroom and their own rules are unchanged). - hotcrm charter: hotcrm's own cards, decision cards included, live in hotcrm; the platform-gap exception row and the seam-label row stay byte-identical. Net-zero lines in all three files (812 / 151 / 53), every rewritten line within the 120-byte width rule. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MoTv7pn338AZ71owsp19gQ
维护者速读改了什么 —— 派发协议里三行把「元数据项目的决策卡」送进 objectstack 收件箱的规则,改成你说的做法:单车道仓(hotcrm 等元数据项目)的决策卡入本仓收件箱;收件箱按仓,平台决策在 objectstack / objectui,元数据项目在本仓;目标仓够不着是读数缺口不是落点,由够得着的席位在目标仓立卡。核心条款一处孪生行同改,hotcrm 章程一行改成「hotcrm 自己的卡(含决策卡)都住 hotcrm 仓」。三个文件各改一行级,净零行,全在天花板上。 为什么改 —— 你的原话(PR 正文顶部逐字引用):hotcrm 所有的卡本来就应该在 hotcrm,其他元数据项目同理,只有平台问题才给平台立卡,现在就是这么操作的。实测也是:hotcrm 有全套状态标签,三张决策卡已经住在 hotcrm。规则文本反着写,新席位照本宣科就会把卡放错仓。 风险与代价(含回滚) —— 纯文本,无代码、无门禁逻辑。风险一点:「目标仓不可达」那行从「落 objectstack」改成「由可达席在目标仓立卡」,对没有任何可达席的仓(cloud / objectos / www 当前无席位)意味着卡先只在座位贴或协调卡上记着;这是把真实状态写明,不是新的等待。回滚 = 整个 PR 反向,无依赖。 席位意见 —— 本席按契约复审档自审通过:三行与你的原话逐句对得上;core-rules 孪生行落在带「在飞卡不中途转仓」的那行(dev 量过另两行没有 120 字节余量,本席认可这个落点);hotcrm 章程改在「纯 hotcrm 修复住 hotcrm 仓」那行,例外行与缝标签行保持原样。棘轮 812 / 151 / 53 净零,决策框架块 md5 未动,frame-sync、id-lint、governed-prose 本席在复核 worktree 重跑全绿。objectstack 里现存 6 张 你要做的 —— 人工合并本 draft PR(受管面 Generated by Claude Code |
Fixes #17288
裁决 — the maintainer's words, verbatim and untranslated (PM chat session, 2026-09-10T03:2xZ)
「hotcrm 所有的卡本来就应该在 hotcrm,包括其他元数据项目。除非元数据项目发现平台由问题,给平台立卡片。现在就是这么 操作的」
Reading (binding, as the card carries it): a metadata project's cards — work cards AND decision cards — live in that project's own repo (hotcrm and every other metadata project); the only cards a metadata project files on the platform are the platform problems it finds, filed as ordinary platform cards on objectstack / objectui. That is already the practice (hotcrm carries the full state-label set including
needs-user-decisionand holds open decision cards today); the rule text was what disagreed, in three 〈多仓协调〉 rows, their core-rules digest twin, and the hotcrm charter.Every rewritten line, before / after, beside the ruling clause it implements
Net-zero lines in all three files; every rewritten line sits under the ratchet's 120-byte width rule (measured widths in brackets).
1.
SKILL.md〈多仓协调〉, the 单车道仓 row — implements 「hotcrm 所有的卡本来就应该在 hotcrm,包括其他元数据项目」 (a single-lane repo's decision cards live in that repo's own inbox; nothing defaults to objectstack).repo:*席自理机械三务,⛔ 不产domain:*;决策卡默认入 objectstack 收件箱。」repo:*席自理机械三务,⛔ 不产domain:*;决策卡入本仓收件箱,不落 objectstack。」2.
SKILL.md〈多仓协调〉, the 收件箱 row under 规则 1 — implements the same clause read from the inbox side (the maintainer's inbox is per repo: objectstack and objectui for platform decisions, each metadata project for its own).needs-user-decision跨仓勤务」), which was checked and left unchanged — it already reads every repo's inbox.3.
SKILL.md〈多仓协调〉, the 目标仓不可达 row under 规则 5 — implements 「现在就是这么 操作的」 together with 「除非元数据项目发现平台由问题,给平台立卡片」: an unreachable target repo is a reading gap, not a home; a card that belongs in another repo is filed there by a seat that can reach it, and the seam rule (规则 1 的缝卡三行, untouched) stays for genuine coordination cards only.repo:*+ 具名读者。」4.
references/core-rules.md〈多仓协调〉 digest, the line carrying 「在飞卡 ⛔ 不中途转仓」 — the twin (SKILL.md 优先级 rule: 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」) of rows 1 and 2.5.
references/lanes/hotcrm.md〈范围〉, the last row — the mirror sentence: hotcrm's own cards, decisions included, live in hotcrm. Folded into the row that already said the work-card half (「纯 hotcrm 修复住 hotcrm 仓」), so the platform-gap exception row (「建设 hotcrm 时发现的平台能力缺口,立普通平台卡到 objectstack 或 objectui」 — the ruling's 「除非…给平台立卡片」, already the practice) and the seam-label row (「repo:hotcrm缝标签只给真协调卡」) stay byte-identical, as the card asks.Untouched by construction (md5 measured before and after): the decision frame block (
22f2339f0acb64cdb50c7adc9db681c3), the lane table, every tier row, the state table'sneeds-user-decisionrow (「维护者的收件箱」 is generic and stays). No issue numbers, no model names, no ruling dates in any skill file — the date lives here.维护者速读(草稿)
改了什么
把 PM 技能里三条「卡片住哪个仓」的规则改成你说的做法:元数据项目(hotcrm 等)自己的卡,包括要你拍板的决策卡,住它自己的仓;平台的决策卡住 objectstack / objectui;元数据项目只有发现平台问题时才在平台仓立普通卡。顺带把核心条款摘要和 hotcrm 车道说明改成同一句话。三个文件行数不变,只改了五行文字。
为什么改
规则原文写的是「决策卡默认入 objectstack 收件箱」「维护者收件箱恒为 objectstack」「目标仓不可达就落 objectstack」——和你 9 月 10 日说的「hotcrm 所有的卡本来就应该在 hotcrm」正好相反,也和实际做法相反(hotcrm 仓今天就挂着
needs-user-decision的卡)。规则和做法打架,下一个按规则行事的席位就会把 hotcrm 的决策卡立错仓。风险与代价(含回滚)
repo:hotcrm的六张、决策箱里问同一件事的 objectui 那张)不在本 PR 里动,归分诊或各仓席位另行搬迁。席位意见
(留空)
你要做的
一个动作:人工合并本 PR(
.claude/**是受管面,只能你来合)。Acceptance notes
node scripts/pm/check-governed-merges.mjs --test SKILL.md core-rules.md lanes/hotcrm.md→ exit 3, verdict line: 「governed-surface predicate: 3 of 3 path(s) hit the register (5 surfaces, repo-agnostic). ⛔ GOVERNED — a human merge is the review record for this PR」. Draft PR; never ready / enqueue / auto-merge / approve by any seat..claude/**ships in any package'sfiles[]; the PM appliesskip-changeset.pnpm check:pm-skill-ratchet→ exit 0 — 「.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)」「references/core-rules.md is 151 lines (ceiling 151; headroom 0)」「references/lanes/hotcrm.md is 53 lines (ceiling 53; headroom 0)」; no line over the 120-byte budget.pnpm check:skill-frame-sync→ exit 0 — 「2 copies of the decision frame are structurally isomorphic across 2 files … 76 markdown files scanned for undeclared copies」.pnpm check:skill-compatibility→ exit 0 — 「11 SKILL.md file(s) reconciled against 80 workspace packages … 11 pinned major(s) all match」.pnpm check:pm-skill-id-lint→ exit 0 — 「27 file(s) clean (pattern /#[0-9]{3,}/g)」.pnpm check:pm-governed-prose→ exit 0 — 「2 instruction surface(s) name all 5 registered governed surfaces … and claim no others」.pnpm check:nul-bytes→ exit 0 — 「OK (scanned 8150 text file(s) … no raw ASCII control bytes)」.pnpm check:pm-governed-merges→ exit 0 (self-test 274 assertions; live generator certified this tree).check:agent-test-spelling,check:doc-authoring,check:driver-memory-census,check:refd-timer-probe,check:watch-hint-literal,node scripts/check-closing-keyword-parity.mjs(+--self-test),node scripts/check-comment-mask-corpus.mjs,node scripts/pm/check-governed-queue-guard.mjs --self-test→ all exit 0.pnpm --filter @objectstack/lint run check:doc-formula-expressions→ exit 3 PREREQUISITE NOT MET on the fresh worktree (@objectstack/formulaand@objectstack/lintunbuilt); built both underscripts/pm/os-verify-lock.sh(VERDICT command-exit 0, lock held 169s, waited 0s) and reran → exit 0 — 「✓ check:doc-formula-expressions: 14 predicate(s) on a statically determinable field layer judged clean; 6 skipped as undeterminable」.node scripts/pm/dispatch-gates.mjs --commands(no paths; the script took the changeset itself — 3 committed paths vs merge base 8c9bd8f) = 16 families, identical to the path-based preview;--ranreconciliation: 「16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED」, one extra beyond the union (check:skill-compatibility).c47edbb2,d03c3c96,8efe2753confirmed ongit log; the rows sat at :191 / :210 / :235 on8c9bd8f5— re-measured after fetch, unchanged. C:check:pm-governed-proseandcheck:skill-compatibilityboth green above (the prose gate reads governed-surface code spans, not these rows). D: no card numbers in any skill file; the relocation of the existingrepo:hotcrm/repo:objectuicards is not in this diff. E: the state table'sneeds-user-decisionrow stays byte-identical.repo:objectui, but objectui IS reachable — the seam fallback is being used where its precondition does not hold #17250 is evidence only and is not decided here; the sixrepo:hotcrmcards in objectstack and the 22repo:objectuicards are relocation acts for triage / the repo seats. Delete the published skills/objectstack-pm-dispatch skill — a stale three-state copy of the internal PM protocol with no known consumer, shipped into every new app — and retire its catalog row, docs page, frame-sync copy, tier-table entry, ratchet pins and gate fixtures (maintainer ruling 2026-09-10) #17311 (parallel) ownsscripts/pm/dispatch-gates.mjs,scripts/check-*,skills/**,packages/**and the docs page — none touched here.Generated by Claude Code